﻿using System.Collections.Generic;
using System.Threading;
using DimensionsHelper.Common.Contracts.Excel;
using DimensionsHelper.Common.Sql;

namespace DimensionsHelper.Common.Contracts.Sql;

/// <summary>
///     输入文件信息
/// </summary>
public class SqlBuilderInputFileInfo
{
    /// <summary>
    ///     输入文件信息
    /// </summary>
    /// <param name="fileName">文件路径</param>
    /// <param name="operator">使用的电子表格操作器实例，不要打开，将在读取的时候依次打开</param>
    public SqlBuilderInputFileInfo(string fileName, IExcelWorkbookOperator @operator)
    {
        FileName = fileName;
        Operator = @operator;
    }

    /// <summary>文件路径</summary>
    public string FileName { get; }

    /// <summary>使用的电子表格操作器实例，不要打开，将在读取的时候依次打开</summary>
    public IExcelWorkbookOperator Operator { get; }
}


public interface ISqlBuilder : IProjectBase<MetadataCodeMap>
{
    /// <summary>
    ///     是否填充统计样本结果的数据表。只有此属性配置为true时，才能输出统计结果数据表。
    /// </summary>
    bool FillSampleDataTable { get; set; }

    /// <summary>
    ///     在构建元数据文档时，是否对于相同的分类列表进行合并声明。
    /// </summary>
    bool AutoMergeList { get; set; }

    /// <summary>
    ///     读取指定路径的Excel文档。
    /// </summary>
    /// <param name="fileInfo">输入文件信息</param>
    void ReadExcel(SqlBuilderInputFileInfo fileInfo);

    /// <summary>
    ///     读取指定路径的Excel文档，并允许中途取消。
    /// </summary>
    /// <param name="fileInfo">输入文件信息</param>
    /// <param name="cancellationToken">多线程取消令牌</param>
    void ReadExcel(SqlBuilderInputFileInfo fileInfo, CancellationToken cancellationToken);

    /// <summary>
    ///     读取指定路径列表的Excel文档。
    /// </summary>
    /// <param name="fileInfos">输入文件信息。</param>
    void ReadExcel(IEnumerable<SqlBuilderInputFileInfo> fileInfos);

    /// <summary>
    ///     读取指定路径列表的Excel文档，并允许中途取消。
    /// </summary>
    /// <param name="fileInfos">输入文件信息。</param>
    /// <param name="cancellationToken">多线程取消令牌</param>
    void ReadExcel(IEnumerable<SqlBuilderInputFileInfo> fileInfos, CancellationToken cancellationToken);

    /// <summary>
    ///     将SQL脚本输出到指定路径的文件，如果不存在，将创建，如果已存在，将覆盖。
    /// </summary>
    /// <param name="filePath">指定路径</param>
    void Export(string filePath);

    /// <summary>
    ///     将已读取的结果输出到Excel文件中。
    /// </summary>
    /// <param name="workbook">已打开的电子表格</param>
    void ExportDataTableToExcel(IExcelWorkbookOperator workbook);

    /// <summary>
    ///     将元数据脚本输出到指定的文件中。
    /// </summary>
    /// <param name="filePath">指定文本文件路径，如果文件已存在，将覆盖已有文件。</param>
    void ExportMetadata(string filePath);

    /// <summary>
    ///     清空所有已读取的内容。
    /// </summary>
    void Clear();
}


public interface IInsertSqlBuilder : ISqlBuilder
{
}


public interface IUpdateSqlBuilder : ISqlBuilder
{
}